import { defineConfig, loadEnv } from "vite";
import vue from "@vitejs/plugin-vue";
import VueSetupExtend from "vite-plugin-vue-setup-extend";

import AutoImport from "unplugin-auto-import/vite";
import requireTransform from "vite-plugin-require-transform";
import Components from "unplugin-vue-components/vite";

import { PrimeVueResolver } from "@primevue/auto-import-resolver";
import vuetify from "vite-plugin-vuetify";
import path from "path";
const pathSrc = path.resolve(__dirname, "src");

// https://vitejs.dev/config/
export default defineConfig(({ command, mode }) => {
  // 根据当前工作目录中的 `mode` 加载 .env 文件
  // 设置第三个参数为 '' 来加载所有环境变量，而不管是否有 `VITE_` 前缀。
  const env = loadEnv(mode, process.cwd());
  return {
    // 配置环境变量
    env: {
      VITE_APP_TITLE: "JPrime-Vite-UI",
      VITE_APP_ENV: env.VITE_APP_ENV,
      VITE_APP_API_URL: env.VITE_APP_API_URL || "http://localhost:8080",
    },

    // 配置插件
    plugins: [
      vue(), // 引入vue插件
      VueSetupExtend(), // 引入vite-plugin-vue-setup-extend插件
      vuetify(),
      AutoImport({
        imports: ["vue", "vue-router", "pinia", "vue-i18n"], // 自动导入的依赖
        dirs: ["./src/apis", "./src/hooks"], // 自动导入的目录
        dts: "./src/auto-imports.d.ts", // 自动生成.d.ts文件
        // dts: path.resolve(pathSrc, "auto-imports.d.ts"), // 自动生成.d.ts文件
      }),
      Components({
        // 引入组件解析器插件
        resolvers: [
          // PrimeVue组件解析器
          PrimeVueResolver(),
        ],
        dts: true, // 自动生成.d.ts文件
      }),
      // 引入vite-plugin-require-context-hook插件，解决不能使用require引入文件的问题
      requireTransform({
        fileRegex: /.js$|.ts$|.vue$/,
      }),
    ],
    // 配置src目录解析别名
    resolve: {
      alias: {
        "@": pathSrc,
      },
    },
    // 配置服务器
    server: {
      port: 80,
      open: true,
      proxy: {
        "/api": {
          target: env.VITE_APP_API_URL,
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/api/, ""),
        },
      },
    },

    // 配置构建
    build: {
      outDir: "dist", // 输出目录
      assetsDir: "assets", // 静态资源目录
      emptyOutDir: true, // 输出目录清空
      rollupOptions: {
        // 构建配置
        input: {
          main: "src/main.ts", // 入口文件
        },
      },
    },
  };
});
